import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Arrays;
import java.util.Random;


public class StartGame extends GameFrame
{
    StartGame(int bomb_number)
    {

        if(bomb_number>100) bomb_number=50;
        BOMB_NUM=bomb_number;

        //给重新游戏按键绑定监听操作
        replayItem.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                InitGame();
            }
        });



        //初始化地图,包括地图上的按钮进行绑定鼠标监听等操作
        InitMap();
        //清除上一句游戏的记录,同时在地图上生成雷
        InitGame();

        this.setVisible(true);

    }

    private void InitMap()
    {
        for(int i=0;i<10;i++)
            for(int j=0;j<10;j++)
            {
                int[] opp={i,j};

                JButton jButton=new JButton();
                jButton.setBounds(50*i,50*j,50,50);
                jButton.setForeground(Color.BLUE);
                this.getContentPane().add(jButton);

                jButton.addMouseListener(new MouseListener()
                {
                    @Override
                    public void mouseClicked(MouseEvent e)
                    {
                        if(!is_end) op(opp[0],opp[1]);
                    }
                    @Override
                    public void mousePressed(MouseEvent e) {}
                    @Override
                    public void mouseReleased(MouseEvent e) {}
                    @Override
                    public void mouseEntered(MouseEvent e) {}
                    @Override
                    public void mouseExited(MouseEvent e) {}
                });

                Map[i][j]=jButton;

            }
    }


    private void InitGame()
    {
        //初始化数据
        for(int[] t:bomb_num) Arrays.fill(t,0);
        for(boolean[] t:visited) Arrays.fill(t,false);
        for(int i=0;i<10;i++)
            for(int j=0;j<10;j++)
            {
                Map[i][j].setForeground(Color.BLUE);
                Map[i][j].setText("");
            }
        is_end=false;
        total=100-BOMB_NUM;


        //生成雷
        Random r=new Random();
        int cnt=BOMB_NUM;
        while(cnt>0)
        {
            int x=r.nextInt(10);
            int y=r.nextInt(10);
            if(bomb_num[x][y]!=-1)
            {
                bomb_num[x][y]=-1;
                cnt--;
            }
        }


        //统计类的数量填充bomb_num数组
        //这里为遍历bomb_num数组每一个元素,因此上面不需要初始化bomb_num数组
        for(int i=0;i<10;i++)
            for(int j=0;j<10;j++)
            {
                //该位置是雷
                if(bomb_num[i][j]==-1) continue;
                //该位置不是雷,统计其周围雷的数量
                cnt=0;
                for(int k=0;k<8;k++)
                {
                    int X=i+dx[k],Y=j+dy[k];
                    if(X<0||Y<0||X>=10||Y>=10) continue;//越界检查

                    if(bomb_num[X][Y]==-1) cnt++;//该位置检测到雷

                }
                bomb_num[i][j]=cnt;
            }

    }


    //玩家的操作
    private void op(int x,int y)
    {
        //该位置是雷,游戏结束
        if(bomb_num[x][y]==-1)
        {
            is_end = true;

            for(int i=0;i<10;i++)
                for(int j=0;j<10;j++)
                    if(bomb_num[i][j]==-1)
                    {
                        Map[i][j].setForeground(Color.RED);
                        Map[i][j].setText("*");
                    }

            return;
        }


        //如果该位置周围8个格子都没有雷,将会递归排雷
        //如果该位置被访问过,将忽略点击操作;
        if(!visited[x][y]) dfs(x,y);

        //排雷完毕，游戏结束
        if(total<=0)
        {
            is_end = true;

            for(int i=0;i<10;i++)
                for(int j=0;j<10;j++)
                    if(bomb_num[i][j]==-1)
                    {
                        Map[i][j].setForeground(Color.ORANGE);
                        Map[i][j].setText("*");
                    }

        }

    }

    //排雷函数
    private void dfs(int x,int y)
    {

        Map[x][y].setText(bomb_num[x][y]+"");
        visited[x][y]=true;
        total--;

        if(bomb_num[x][y]!=0) return;

        //递归排雷
        for(int i=0;i<8;i++)
        {
            int X=x+dx[i],Y=y+dy[i];

            if(X<0||Y<0||X>=10||Y>=10) continue;

            if(visited[X][Y]) continue;
            if(bomb_num[X][Y]==-1) continue;

            dfs(X,Y);

        }

    }


    //雷的数量
    private final int BOMB_NUM;
    //由按钮组成的地图
    JButton[][] Map=new JButton[10][10];
    //true代表已经访问过
    private boolean[][] visited=new boolean[10][10];
    //记录以该点为中心的3x3方格有多少个雷,如果该位置是雷则用-1表示
    private int[][] bomb_num=new int[10][10];
    //true代表游戏已经结束,玩家点击按钮无效
    private boolean is_end;
    //空位的数量
    private int total;

    //某个点八个方向的向量,用于填充bomb_num数组和递归排雷
    private final int[] dx={0,0,1,-1,1,1,-1,-1};
    private final int[] dy={1,-1,0,0,1,-1,1,-1};


}
